#include <QuickTime/QuickTime.h>
//////////
//
// drawMultiPagePDF
//
// 複数ページある PDF 文書ファイルをムービーとして開き、
// 各ページを走査して指定されたポートに描画
//
//
//////////
void drawMultiPagePDFtoPort(FSSpec *pdfFileSpec, CGrafPtr thePort)
{
OSErr err = noErr;
Movie theMovie = nil;
short movieFileRefNum = 0;
Track firstVideoTrack = nil;
// PDF ファイルを開く
err = OpenMovieFile(pdfFileSpec, &movieFileRefNum, fsRdPerm);
if (err) goto bail;
// ファイルからムービーを作成
err = NewMovieFromFile(&theMovie,
movieFileRefNum,
NULL,
NULL,
newMovieActive,
NULL);
if (err) goto bail;
// ムービーを描画するポートを設定
SetMovieGWorld(theMovie,thePort,nil);
if (GetMoviesError()) goto bail;
// ムービーの第 1 ビデオトラックを取得
firstVideoTrack = GetMovieIndTrackType(theMovie,
1,
VideoMediaType,
movieTrackMediaType);
if (firstVideoTrack)
{
long frameCount = 0;
// ビデオトラックのフレーム数を取得
frameCount = getFrameCount (firstVideoTrack);
for ( ; frameCount > 0; frameCount--)
{
// ポートにフレーム(PDF ページ)を描画
drawMovieFrameNextOrPrev (theMovie, fixed1);
}
}
bail:
if (movieFileRefNum)
{
CloseMovieFile(movieFileRefNum);
}
if (theMovie)
{
DisposeMovie(theMovie);
}
}
//////////
//
// getFrameCount
// 指定されたムービートラックのフレーム数を取得。
// エラーが発生した場合は、値 -1 を返し、
// トラックのフレーム数は特定できない
//
// 「Jr.c」の ConvertToMovie にあるフレームカウントに基づく
// (厳密ではない)
//
// Interesting Time(トラックが新しいサンプルを表示する場所)
// のすべてを走査することにより、トラックのフレーム数をカウント
//
//////////
long getFrameCount (Track theTrack)
{
long myCount = -1;
short myFlags;
TimeValue myTime = 0;
if (theTrack == NULL)
goto bail;
// トラックの最初の フレーム(サンプル)から開始したい
myFlags = nextTimeMediaSample + nextTimeEdgeOK;
while (myTime >= 0) {
myCount++;
// トラック中の次フレームを探す。それ以上フレームがなければ
// myTime に -1 が設定され、while ループを抜ける
GetTrackNextInterestingTime(theTrack,
myFlags,
myTime,
fixed1,
&myTime,
NULL);
// 最初の Interesting Time 以降は、現在の Interesting Time を含めない
//
myFlags = nextTimeStep;
}
bail:
return(myCount);
}
//////////
//
// drawMovieFrameNextOrPrev
// QuickTime ムービーの直前または直後のビデオサンプルを描画
// theRate が 1 ならば、直後のビデオサンプルを描画
// theRate が -1 ならば、直前のビデオサンプルを描画
//
//////////
OSErr drawMovieFrameNextOrPrev (Movie theMovie, Fixed theRate)
{
TimeValue myCurrTime;
TimeValue myNextTime;
short myFlags;
OSType myTypes[1];
OSErr myErr = noErr;
if (theMovie == NULL)
return(invalidMovie);
// ムービーのメディアの次のフレームを取得したい
myFlags = nextTimeStep;
// ビデオサンプルを取得したい
myTypes[0] = VisualMediaCharacteristic;
myCurrTime = GetMovieTime(theMovie, NULL);
GetMovieNextInterestingTime(theMovie,
myFlags,
1,
myTypes,
myCurrTime,
theRate,
&myNextTime,
NULL);
myErr = GetMoviesError();
if (myErr != noErr)
return(myErr);
myErr = drawMovieFrameAtTime(theMovie, myNextTime);
return(myErr);
}
//////////
//
// drawMovieFrameAtTime
// 指定されたタイミングで QuickTime ムービーのビデオサンプルを描画
//
//////////
OSErr drawMovieFrameAtTime (Movie theMovie, TimeValue theTime)
{
OSErr myErr = noErr;
if (theMovie == NULL)
return(invalidMovie);
// 指定された時間が、ムービーの時間的境界の範囲内にあることを確認
//
if ((theTime < 0) || (theTime > GetMovieDuration(theMovie)))
return(paramErr);
SetMovieTimeValue(theMovie, theTime);
myErr = GetMoviesError();
if (myErr != noErr)
goto bail;
// (イベントを MCIsPlayerEvent に渡し)メインイベントのループで
// ムービーコントローライベントを処理する場合、以下の
// MoviesTask への呼び出しは必要なく、実際、損害はない
// MoviesTask を呼び出してすぐにムービーを再描画する
MoviesTask(theMovie, 0L);
myErr = GetMoviesError();
bail:
return(myErr);
}
|